# -*- coding: utf-8 -*-
# python 3.x 版本
from urllib.request import urlopen
import requests
import json
import pygal
import math
from itertools import groupby

# json_url = 'https://raw.githubusercontent.com/muxuezi/btc/master/btc_close_2017.json'
# response = urlopen(json_url)
# # 读取数据
# req = response.read()
# # 将数据写入到文件
# with open('btc_close_2017.json', 'wb') as f:
#     f.write(req)
# 使用第三方的库requests
# req_quest = requests.get(json_url)
# file_requests = req_quest.json()
# print(file_requests)

file_name = 'btc_close_2017.json'
with open(file_name) as f:
    btc_data = json.load(f)
# 打印出每一天的信息
dates, months, weeks, weekdays, closes = [], [], [], [], []
# 结合pygal来绘图
for btc_dict in btc_data:
    dates.append(btc_dict['date'])
    months.append(int(btc_dict['month']))
    weeks.append(int(btc_dict['week']))
    weekdays.append(btc_dict['weekday'])
    closes.append(int(float(btc_dict['close'])))
    # 输出字符串的格式化
    # print("{} is month {} week {},{}, the close price is {}RMB".format(date, month, week, weekday, close))
line_chart = pygal.Line(x_label_rotation=20, show_minor_x_labels=False)
# 设置标题
line_chart.title = '收盘价(￥)'
line_chart.x_labels = dates
N = 20
line_chart.x_labels_major = dates[::N]
closes_log = [math.log10(_) for _ in closes]
line_chart.add('log收盘价', closes_log)
# 保存至文件
line_chart.render_to_file('收盘价对数变换折线图(￥).svg')


def draw_line(x_data, y_data, title, y_legend):
    xy_map = []
    for x, y in groupby(sorted(zip(x_data, y_data)), key=lambda _: _[0]):
        y_list = [v for _, v in y]
        xy_map.append([x, sum(y_list) / len(y_list)])
    [x_unique, y_mean] = zip(*xy_map)
    line_chart = pygal.Line()
    line_chart.title = title
    line_chart.x_labels = x_unique
    line_chart.add(y_legend, y_mean)
    line_chart.render_to_file(title+'.svg')
    return line_chart


idx_month = dates.index('2017-12-01')
line_chart_month = draw_line(months[:idx_month], closes[:idx_month], '收盘价月日均值(￥)', '月日均值')

idx_week = dates.index('2017-12-11')
line_chart_week = draw_line(weeks[1:idx_week], closes[1:idx_week], '收盘价周日均值(￥)', '周日均值')

wd = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday']
weekdays_int = [wd.index(w)+1 for w in weekdays[1:idx_week]]
line_chart_weekday = draw_line(weekdays_int, closes[1:idx_week], '收盘价星期均值(￥)', '星期均值')
line_chart_weekday.x_labels = ['周一', '周二', '周三', '周四', '周五', '周六', '周日']
line_chart_weekday.render_to_file('收盘价星期均值(￥).svg')

# 使用html一个，保存全部的svg图
with open('收盘价Dashboard.html', 'w', encoding='utf8') as html_file:
    html_file.write('<html><head><title>收盘价Dashboard</title><meta charset="utf-8"></head><body>')
    for svg in ['收盘价折线图(￥).svg', '收盘价对数变换折线图(￥).svg', '收盘价月日均值(￥).svg',
                '收盘价周日均值(￥).svg', '收盘价星期均值(￥).svg']:
        html_file.write(' <object type="image/svg+xml" data="{0}" height=500></object>\n'.format(svg))
    html_file.write('</body></html>')
